package bancosys.tec.security.web;

import java.io.IOException;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import jmine.tec.utils.collection.ClasspathPropertiesLoader;

/**
 * Classe que armazena as chaves de cada classe autorizável do sistema.
 * 
 * @author evaristo.goes
 */
public final class AuthorizationPermissionMapping implements Serializable {

    private static final AuthorizationPermissionMapping INSTANCE;
    static {
        try {
            INSTANCE = new AuthorizationPermissionMapping();
        } catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    private final Map<String, String> mapping;

    private final Set<String> permissions;
    
    /**
     * Construtor que le o arquivo 'authorizationPermissionMapping.properties', que contem as chaves de cada classe autorizável.
     * 
     * @throws IOException Erro ao ler ou localizar o arquivo
     */
    private AuthorizationPermissionMapping() throws IOException {
        this.mapping = new ClasspathPropertiesLoader("authorizationPermissionMapping.properties").getProperties();
        this.permissions = Collections.unmodifiableSet(new HashSet<String>(mapping.values()));
    }

    /**
     * Retorna a única instancia do sistema de AuthorizationPermissionMapping.
     * 
     * @return {@link AuthorizationPermissionMapping}
     */
    public static AuthorizationPermissionMapping getInstance() {
        return INSTANCE;
    }

    /**
     * Retorna a chave da Class passada por parâmetro.
     * 
     * @param clazz Class
     * @return String Chave da Class passada por parâmetro.
     */
    public String getKeyOfClass(Class<?> clazz) {
        return mapping.get(clazz.getCanonicalName());
    }

    /**
     * Devolve a chave da Class passada por parâmetro ou a própria chave, caso não encontrada.
     * 
     * @param clazz Class
     * @return String chave da class passada por parâmetro ou a própria chave
     */
    public String getKeyOfClassOrKey(Class<?> clazz) {
        String key = getKeyOfClass(clazz);
        if (key == null) {
        	key = clazz.getCanonicalName();
        }
        return key;
    }
    
    /**
     * Retorna a chave da Class passada por parâmetro.
     * 
     * @param clazzName Nome da Classe
     * @return String Chave da Class passada por parâmetro.
     */
    public String getKeyOfClass(String clazzName) {
        return mapping.get(clazzName);
    }

    /**
     * Devolve a chave da Class passada por parâmetro ou a própria chave, caso não encontrada.
     * 
     * @param clazzName Class
     * @return String chave da class passada por parâmetro ou a própria chave
     */
    public String getKeyOfClassOrKey(String clazzName) {
        String key = getKeyOfClass(clazzName);
        if (key == null) {
        	key = clazzName;
        }
        return key;
    }
    
    /**
     * @return the permissions
     */
    public Set<String> getPermissions() {
        return permissions;
    }
}